{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线性回归\n",
    "\n",
    "给定一个数据点集合$X$和对应的目标值$y$，线性模型的目标就是找到一条使用向量$w$和位移$b$描述的线，来尽可能地近似每个样本$X[i]$和$y[i]$。用数学符号来表示就是：\n",
    "$$\\hat{y} = Xw + b$$\n",
    "并最小化所有数据点上的平方误差\n",
    "$$\\sum_{i=1}^n (\\hat{y}_i-y_i)^2.$$\n",
    "\n",
    "接下来，我们会先手动写一个线性回归模型，然后再通过 nn 包构建一个线性回归模型。然后你自然而然地就会喜欢上用PyTorch了。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# 导入必要的包\n",
    "import torch\n",
    "from torch.autograd import Variable\n",
    "import torch.nn as nn # 模型包，里面包含了各种各样的模型，方便我们直接使用\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x29b0a3c8160>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 生成用来进行线性回归的模拟数据\n",
    "x = torch.unsqueeze(torch.linspace(-1, 1, 200), dim = 1)\n",
    "y = 5 * x + 0.8 * torch.rand(x.size())\n",
    "\n",
    "# 绘制模拟数据的图像\n",
    "plt.scatter(x.numpy(), y.numpy())\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# 为了能够自动求导，我们要将 x, y 变成 Variable 对象\n",
    "X = Variable(x) # PyTorch中的 Variable 默认是允许自动求导的，所以 requires_grad=True 可以不加\n",
    "Y = Variable(y) # 同上"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Variable containing:\n",
      " 16.4053\n",
      "[torch.FloatTensor of size 1]\n",
      "\n",
      "Variable containing:\n",
      " 9.5732\n",
      "[torch.FloatTensor of size 1]\n",
      "\n",
      "Variable containing:\n",
      " 9.5522\n",
      "[torch.FloatTensor of size 1]\n",
      "\n",
      "Variable containing:\n",
      " 9.5522\n",
      "[torch.FloatTensor of size 1]\n",
      "\n",
      "Variable containing:\n",
      " 9.5522\n",
      "[torch.FloatTensor of size 1]\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x29b0a53d860>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "实际的参数w是： 5 \n",
      "\n",
      "预测的参数w是 Variable containing:\n",
      " 5.0062\n",
      "[torch.FloatTensor of size 1x1]\n",
      "\n",
      "预测的常数项是： Variable containing:\n",
      " 0.4081\n",
      "[torch.FloatTensor of size 1x1]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 定义参数初始化函数\n",
    "def init_parameters():\n",
    "    W = Variable( torch.randn(1, 1), requires_grad=True)  # 随机初始化 w\n",
    "    b = Variable( torch.zeros(1, 1), requires_grad=True )  # 初始化偏差\n",
    "    parameters = {\"W\": W, \"b\": b}\n",
    "    return parameters\n",
    "\n",
    "# 定义模型\n",
    "def model(X, parameters):\n",
    "    return X * parameters[\"W\"] + parameters[\"b\"]\n",
    "\n",
    "# 定义损失函数\n",
    "def square_loss(y_hat, Y):\n",
    "    loss = (y_hat - Y).pow(2).sum()\n",
    "    return loss\n",
    "\n",
    "# 使用梯度来更新参数\n",
    "def update_parameters(parameters, lr):\n",
    "    parameters[\"W\"].data -= lr * parameters[\"W\"].grad.data\n",
    "    parameters[\"b\"].data -= lr * parameters[\"b\"].grad.data\n",
    "    return\n",
    "\n",
    "####     超参数     ####\n",
    "EPOCH = 100 # 迭代次数\n",
    "learning_rate = 0.001 # 学习速率\n",
    "\n",
    "parameters = init_parameters() # 参数初始化\n",
    "\n",
    "####     开始训练     ####\n",
    "for t in range(EPOCH):\n",
    "    # 对x进行预测\n",
    "    y_hat = model(X, parameters)\n",
    "    # 计算损失\n",
    "    loss = square_loss(y_hat, Y)\n",
    "    # 反向求导\n",
    "    loss.backward()\n",
    "    # 通过梯度，更新参数\n",
    "    update_parameters(parameters, learning_rate)\n",
    "    if (t+1) % 20 == 0:\n",
    "        print(loss)\n",
    "    # 因为自动求导会对梯度自动地积累，所以，我们要清除梯度\n",
    "    parameters[\"W\"].grad.data.zero_()\n",
    "    parameters[\"b\"].grad.data.zero_()\n",
    "\n",
    "# 画图\n",
    "plt.scatter(X.data.numpy(), Y.data.numpy())\n",
    "plt.plot(X.data.numpy(), y_hat.data.numpy(), 'r-', lw = 4)\n",
    "plt.show()\n",
    "\n",
    "print(\"实际的参数w是： 5 \\n\" )\n",
    "print(\"预测的参数w是\", parameters[\"W\"])\n",
    "print(\"预测的常数项是：\" , parameters[\"b\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 用torch.nn来构建模型\n",
    "\n",
    "在PyTorch中 nn 包定义了一系列基本组件，这些组件（Modules）涵盖了大部分构建神经网络会使用的各种层。一个组件（Modules）的输入是Variable，经过组件之后，输出又是另一个 Variable。\n",
    "\n",
    "**当然nn包中还包含了大部分我们平时使用的损失函数**。\n",
    "\n",
    "**最后torch.optim中还含有很多我们平时使用的优化算法，用来更新梯度**。（我们上面使用的就是梯度下降法，只不过上面是我们自己手写，现在可以直接调用了）\n",
    "\n",
    "刚才，我们使用的是Tensor和autograd来构建线性回归的模型，现在，我们来使用torch.nn来快速构建一个线性回归模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Variable containing:\n",
      " 16.0952\n",
      "[torch.FloatTensor of size 1]\n",
      "\n",
      "Variable containing:\n",
      " 9.5723\n",
      "[torch.FloatTensor of size 1]\n",
      "\n",
      "Variable containing:\n",
      " 9.5522\n",
      "[torch.FloatTensor of size 1]\n",
      "\n",
      "Variable containing:\n",
      " 9.5522\n",
      "[torch.FloatTensor of size 1]\n",
      "\n",
      "Variable containing:\n",
      " 9.5522\n",
      "[torch.FloatTensor of size 1]\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x29b0a3bac50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "实际的参数w是： 5 \n",
      "\n",
      "预测的参数w是 Variable containing:\n",
      " 5.0062\n",
      "[torch.FloatTensor of size 1x1]\n",
      "\n",
      "预测的常数项是： Variable containing:\n",
      " 0.4081\n",
      "[torch.FloatTensor of size 1x1]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 还是使用上述的X和Y\n",
    "\n",
    "X = Variable(x) # PyTorch中的 Variable 默认是允许自动求导的，所以 requires_grad=True 可以不加\n",
    "Y = Variable(y) # 同上\n",
    "\n",
    "####     超参数     ####\n",
    "EPOCH = 100 # 迭代次数\n",
    "learning_rate = 0.001 # 学习速率\n",
    "\n",
    "\n",
    "# 定义模型\n",
    "# 使用 nn包来定义我们的模型，这里的Linear表示的是线性模型，我们在初始化这个模型的时候，\n",
    "# 需要传入的参数是: in_features, out_features 也就是输出特征和输出特征\n",
    "# 默认会帮我们初始化权重，当然，我们也可以手动初始化权重（这里暂时不说）\n",
    "model = nn.Linear(1, 1)\n",
    "\n",
    "# 定义损失函数\n",
    "# 我们使用 Mean Square Loss作为我们的损失函数\n",
    "# size_average=False表示我们需要的是总的误差，不需要去平均误差\n",
    "square_loss = nn.MSELoss(size_average=False)\n",
    "\n",
    "\n",
    "# 定义优化方法\n",
    "# 以前，我们的梯度下降法都是我们手写的，现在，我们可以使用nn为我们封装好的。\n",
    "# 使用optim包来定义优化算法，可以自动的帮我们对模型的参数进行梯度更新\n",
    "# model.parameters()会自动的为我们将模型中的参数提取出来。然后我们告诉优化器，它们是我们要更新的参数。\n",
    "# lr表示的是学习速率\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)\n",
    "\n",
    "####     开始训练     ####\n",
    "for t in range(EPOCH):\n",
    "    \n",
    "    # 没有变化，还是这样使用：对x进行预测\n",
    "    y_hat = model(X)\n",
    "    \n",
    "    # 没有变化，计算损失\n",
    "    loss = square_loss(y_hat, Y)\n",
    "    \n",
    "    # 打印损失\n",
    "    if (t+1) % 20 == 0:\n",
    "        print(loss)\n",
    "    # 在我们反向求导之前，我们需要清空积累的梯度，由于我们使用的是 torch.optim包中的对象，我们可以直接调用\n",
    "    # 该对象的方法，来自动的清空积累的梯度\n",
    "    optimizer.zero_grad()\n",
    "    \n",
    "    # 反向求导，也没变\n",
    "    loss.backward()\n",
    "    \n",
    "    # 反向求导结束，我们开始更新梯度，以前更新梯度需要手动输入w1.grad.data，现在只需要一行代码就可以搞定了！\n",
    "    optimizer.step()\n",
    "    \n",
    "\n",
    "\n",
    "# 画图\n",
    "plt.scatter(X.data.numpy(), Y.data.numpy())\n",
    "plt.plot(X.data.numpy(), y_hat.data.numpy(), 'r-', lw = 4)\n",
    "plt.show()\n",
    "\n",
    "print(\"实际的参数w是： 5 \\n\" )\n",
    "print(\"预测的参数w是\", parameters[\"W\"])\n",
    "print(\"预测的常数项是：\" , parameters[\"b\"])"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [default]",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
